# _*_ coding:utf-8 _*_
"""
@author:lx
@file: softmax_regression
@contact: lixiang-929@outlook.com
@time: 2018/08/10
"""
import tensorflow as tf
#导入教学模型
from tensorflow.examples.tutorials.mnist import input_data
#读入mnist数据
mnist = input_data.read_data_sets('MNIST_data/',one_hot=True)
#x是一个占位符（placeholder），代表待识别的图片
x = tf.placeholder(tf.float32,[None,784])
# W是Softmax模型的参数，将一个784维的输入转换为一个10维的输出
W = tf.Variable(tf.zeros([784,10]))
# b是又一个Softmax模型的参数，我们一般叫做“偏置项”（bias）
b = tf.Variable(tf.zeros([10]))
# y=softmax(Wx + b)，y表示模型的输出
y = tf.nn.softmax(tf.matmul(x,W) + b)
# y_是实际的图像标签，同样以占位符表示
y_ = tf.placeholder(tf.float32,[None,10])

# 根据y, y_构造交叉熵损失
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y)))        #定义交叉熵损失
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)        #梯度下降法优化损失

# 创建一个Session。只有在Session中才能运行优化步骤train_step
sess = tf.InteractiveSession()
# 运行之前必须要初始化所有变量，分配内存
tf.global_variables_initializer().run()

for _ in range(1000):
    batch_xs,batch_ys = mnist.train.next_batch(100)
     # 在Session中运行train_step，运行时要传入占位符的值，用feed_dict={x:x,y_:y}
    sess.run(train_step,feed_dict={x:batch_xs,y_:batch_ys})
    correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))              #取出每一行最大值对应的下标位置做比较
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))          #将比较出的结果true/false转换为0,1
    # 这里是获取最终模型的正确率
    print(sess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels}))


